/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Gestore;

import Entity.Esterni;
import Entity.Feedback;
import Entity.Inserzione;
import Entity.Transazione;
import Entity.Utente;
import Facade.EsterniFacadeLocal;
import Facade.FeedbackFacadeLocal;
import Facade.InserzioneFacadeLocal;
import Facade.TransazioneFacadeLocal;
import Facade.UtenteFacadeLocal;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateful;

/**
 *
 * @author Vito
 */
@Stateful
public class Gestore implements GestoreRemote {

    @EJB
    private EsterniFacadeLocal esterniFacade;
    @EJB
    private FeedbackFacadeLocal feedbackFacade;
    @EJB
    private TransazioneFacadeLocal transazioneFacade;
    @EJB
    private InserzioneFacadeLocal inserzioneFacade;
    @EJB
    private UtenteFacadeLocal utenteFacade;

    @Override
    public void createUtente(String username, String password, String nome, String cognome, GregorianCalendar dataNascita, String indirizzo, String citta, String provincia, String regione, String stato, String codiceFiscale, String email) {
        Utente utente = new Utente();
        utente.setUsername(username);
        utente.setPassword(password);
        utente.setNome(nome);
        utente.setCognome(cognome);
        utente.setDatanascita(dataNascita);
        utente.setIndirizzo(indirizzo);
        utente.setCitta(citta);
        utente.setProvincia(provincia);
        utente.setRegione(regione);
        utente.setStato(stato);
        utente.setCodicefiscale(codiceFiscale);
        utente.setEmail(email);
        utenteFacade.create(utente);
    }

    @Override
    public Utente login(String username, String password) {
        Esterni e = esterniFacade.findByIdInt(utenteFacade.findByUsername(username));
        if (e == null) {
            return (utenteFacade.login(username, password));
        } else {
            return null;
        }
    }

    @Override
    public Utente loginEsterno(String username, String identifier, String nome, GregorianCalendar dataNascita, String indirizzo, String citta, String provincia, String regione, String stato, String email) {
        boolean f = true;
        Utente utente = new Utente();
        Esterni e = esterniFacade.find(identifier);
        if (e != null) {
            utente = utenteFacade.find(e.getIdInt().getId());
            if (utente != null) {
                f = false;
            }
        }
        if (f == true) {
            utente.setUsername(username);
            utente.setNome(nome);
            utente.setDatanascita(dataNascita);
            utente.setIndirizzo(indirizzo);
            utente.setCitta(citta);
            utente.setProvincia(provincia);
            utente.setRegione(regione);
            utente.setStato(stato);
            utente.setEmail(email);
            utente.setPassword("...");
            utenteFacade.create(utente);
            esterniFacade.create(new Esterni(identifier, utente));
        }
        return utente;
    }

    @Override
    public Utente findUtente(int idUtente) {
        return utenteFacade.find(idUtente);
    }

    @Override
    public void editUtente(String username, String password, String nome, String cognome, GregorianCalendar dataNascita, String indirizzo, String citta, String provincia, String regione, String stato, String codiceFiscale, String email, int idUtente) {
        Utente utente = findUtente(idUtente);
        utente.setUsername(username);
        utente.setPassword(password);
        utente.setNome(nome);
        utente.setCognome(cognome);
        utente.setDatanascita(dataNascita);
        utente.setIndirizzo(indirizzo);
        utente.setCitta(citta);
        utente.setProvincia(provincia);
        utente.setRegione(regione);
        utente.setStato(stato);
        utente.setCodicefiscale(codiceFiscale);
        utente.setEmail(email);

        utenteFacade.edit(utente);
    }

    @Override
    public void removeUtente(int idUtente) {
        utenteFacade.remove(utenteFacade.find(idUtente));
    }

    @Override
    public void createInserzione(Integer idUtente, String regione, String provincia, String localita, String indirizzo, String zona, String descrizione, String tipoAbitazione, short stanzeTotali, short stanzeInAffitto, short postiSingoli, short postiDoppi, String parcheggio, String infoAggiuntive, GregorianCalendar inizioDisp, GregorianCalendar fineDisp) {

        Inserzione nuovo = new Inserzione();
        Utente locatore = new Utente();

        locatore = utenteFacade.find(idUtente);
        nuovo.setLocatore(locatore);
        nuovo.setRegione(regione);
        nuovo.setProvincia(provincia);
        nuovo.setLocalita(localita);
        nuovo.setIndirizzo(indirizzo);
        nuovo.setZona(zona);
        nuovo.setDescrizione(descrizione);
        nuovo.setTipoabitazione(tipoAbitazione);
        nuovo.setStanzetotali(stanzeTotali);
        nuovo.setStanzeinaffitto(stanzeInAffitto);
        nuovo.setParcheggio(parcheggio);
        nuovo.setPostilettodoppi(postiDoppi);
        nuovo.setPostilettosingoli(postiSingoli);
        nuovo.setAltreinformazioni(infoAggiuntive);
        nuovo.setDisponibilitainizio(inizioDisp);
        nuovo.setDisponibilitafine(fineDisp);

        //posso creare la nuova inserzione
        inserzioneFacade.create(nuovo);

        //devo aggiungere all'utente le info della nuova inserzione
        if (locatore.getInserzioneList().isEmpty()) {
            locatore.setInserzioneList(new ArrayList<Inserzione>());
            utenteFacade.edit(locatore);
        }
        locatore.getInserzioneList().add(nuovo);
        utenteFacade.edit(locatore);
    }

    @Override
    public Inserzione findInserzione(int idInserzione) {
        return inserzioneFacade.find(idInserzione);
    }

    @Override
    public void editInserzione(Integer idInserzione, String regione, String provincia, String localita,
            String indirizzo, String zona, String descrizione, String tipoAbitazione,
            short stanzeTotali, short stanzeInAffitto, short postiSingoli, short postiDoppi, String parcheggio,
            String infoAggiuntive, GregorianCalendar inizioDisp, GregorianCalendar fineDisp) {
        Inserzione nuovo = findInserzione(idInserzione);

        nuovo.setRegione(regione);
        nuovo.setProvincia(provincia);
        nuovo.setLocalita(localita);
        nuovo.setIndirizzo(indirizzo);
        nuovo.setZona(zona);
        nuovo.setDescrizione(descrizione);
        nuovo.setTipoabitazione(tipoAbitazione);
        nuovo.setStanzetotali(stanzeTotali);
        nuovo.setStanzeinaffitto(stanzeInAffitto);
        nuovo.setParcheggio(parcheggio);
        nuovo.setPostilettodoppi(postiDoppi);
        nuovo.setPostilettosingoli(postiSingoli);
        nuovo.setAltreinformazioni(infoAggiuntive);
        nuovo.setDisponibilitainizio(inizioDisp);
        nuovo.setDisponibilitafine(fineDisp);
        inserzioneFacade.edit(nuovo);

    }

    @Override
    public void removeInserzione(Integer IdInserzione) {
        inserzioneFacade.remove(inserzioneFacade.find(IdInserzione));
    }

    @Override
    public List findInserzioneByParameters(String tipoabitazione, String zona, String regione, String provincia, String localita, String parcheggio) {
        return inserzioneFacade.findInserzioneByParameters(tipoabitazione, zona, regione, provincia, localita, parcheggio);
    }

    @Override
    public List findInserzioneByLocatore(Integer idUtente) {
        return inserzioneFacade.findInserzioneByLocatore(idUtente);
    }

    @Override
    public List findAllInserzione() {
        return inserzioneFacade.findAll();
    }

    @Override
    public boolean controllaDate(Inserzione ins, GregorianCalendar start, GregorianCalendar end) {
        boolean ret = false;
        if (!ins.getDisponibilitainizio().after(start) && !ins.getDisponibilitafine().before(end) && start.before(end)) {
            ret = true;
        }
        return ret;
    }

    @Override
    public void createTransazione(Integer idInserzione, Integer idLocatario, GregorianCalendar data, GregorianCalendar inizio, GregorianCalendar fine) {
        Transazione nuovo = new Transazione();
        nuovo.setInserzione(inserzioneFacade.find(idInserzione));
        nuovo.setInizioprenotazione(inizio);
        nuovo.setFineprenotazione(fine);
        nuovo.setDatatransazione(data);
        nuovo.setLocatario(utenteFacade.find(idLocatario));
        transazioneFacade.create(nuovo);
    }

    @Override
    public Transazione findTransazione(int idTransazione) {
        return transazioneFacade.find(idTransazione);
    }

    @Override
    public List findTransazioneByLocatore(Integer idUtente) {
        return transazioneFacade.findTransazioneByLocatore(idUtente);
    }

    @Override
    public List findTransazioneByLocatario(Integer idUtente) {
        return transazioneFacade.findTransazioneByLocatario(idUtente);
    }

    //metodi relativi al FEEDBACK
    @Override
    public void createFeedbackLocatore(Integer idAutore, Integer idRicevente, Integer idTransazione, GregorianCalendar dataFeed, String descrizione, short punteggio) {
        Transazione t = new Transazione();
        Feedback nuovo = new Feedback();
        nuovo.setAutore(idAutore);
        nuovo.setRicevente(idRicevente);
        nuovo.setDescrizione(descrizione);
        nuovo.setPunteggio(punteggio);
        nuovo.setDatafeed(dataFeed);

        Utente autore = utenteFacade.find(idAutore);
        Utente ricevente = utenteFacade.find(idRicevente);
        nuovo.setAutore(autore.getId());
        nuovo.setRicevente(ricevente.getId());

        feedbackFacade.create(nuovo);

        t = transazioneFacade.find(idTransazione);
        t.setFeedlocatore(nuovo);
        transazioneFacade.edit(t);
    }

    @Override
    public void createFeedbackLocatario(Integer idAutore, Integer idRicevente, Integer idTransazione, GregorianCalendar dataFeed, String descrizione, short punteggio) {
        Transazione t = new Transazione();
        Feedback nuovo = new Feedback();
        nuovo.setAutore(idAutore);
        nuovo.setRicevente(idRicevente);
        nuovo.setDescrizione(descrizione);
        nuovo.setPunteggio(punteggio);
        nuovo.setDatafeed(dataFeed);

        Utente autore = utenteFacade.find(idAutore);
        Utente ricevente = utenteFacade.find(idRicevente);
        nuovo.setAutore(autore.getId());
        nuovo.setRicevente(ricevente.getId());

        feedbackFacade.create(nuovo);

        t = transazioneFacade.find(idTransazione);
        t.setFeedlocatario(nuovo);
        transazioneFacade.edit(t);
    }

    @Override
    public List<Feedback> getFeedBackRicevuti(int ricevente) {
        return feedbackFacade.getFeedBackRicevuti(ricevente);
    }
}
